#include "background.h"

#include <QPainter>
#include <QTimer>
#include <QtMath>

Background::Background(QQuickPaintedItem *parent) : QQuickPaintedItem(parent)
    , m_initlized (false)
{
    connect(this, &QQuickItem::widthChanged, this, &Background::resize);
}

void Background::init() {
    auto timer = new QTimer;
    timer->start(10);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
}

void Background::resize() {
    point = new Point[100];

    for (int i = 0; i < 100; i++) {
        point[i].pos = QPointF((rand() % int(width() * 10)) / 5.0,
                               (rand() % int(height() * 10)) / 5.0);
        point[i].movePos =
            QPointF((rand() % 20) / 10.0 - 1, (rand() % 20) / 10.0 - 1);
    }

    m_initlized = true;
}

void Background::mousePos(int x, int y)
{
    offset = QPoint(x,y);
}

void Background::paint(QPainter *painter)
{
    // 抗锯齿
    painter->setRenderHint(QPainter::Antialiasing, true);

    // 把窗口背景颜色刷成黑色
    //      painter.setBrush(Qt::black);
    //      painter.drawRect(rect());

    // 关键部分
    for (auto i = 0; i < 100; i++) {
        // 对点进行移动，每次调用重绘事件所有占就移动一个此位移量
        point[i].pos = point[i].pos + point[i].movePos;

        // 不能使其跑出窗口，于是，如果点超出窗口就对其相应的位移量取反，数学上
        if (point[i].pos.x() > width() || point[i].pos.x() < 0)
            point[i].movePos.setX(-point[i].movePos.x());
        if (point[i].pos.y() > height() || point[i].pos.y() < 0)
            point[i].movePos.setY(-point[i].movePos.y());

        // 设置点的画笔为 pink，然后就是画出这个点
        painter->setPen(QColor(0, 0, 0));
        painter->drawPoint(point[i].pos);

        // 下面主是对距离比较近的点连续了，要用到求2点的距离公式
        // 遍历所有点，反正就 100 个点 O(n^2) 也不在乎，算法好的可以对其优化一下
        for (auto j = 0; j < 100; j++) {
            // 这里定义的就是50,小于50就连线
            if (pow(point[i].pos.x() - point[j].pos.x(), 2) +
                    pow(point[i].pos.y() - point[j].pos.y(), 2) <=
                50 * 50) {

                // 线性梯度，设置颜色将是线性渐变，可自由搭配
                QLinearGradient linearGradient(point[i].pos.x(), point[i].pos.y(), point[j].pos.x(), point[j].pos.y());
                linearGradient.setColorAt(0, QColor(102, 255, 255));
                linearGradient.setColorAt(1, QColor(153,0,153));

                // 准备刷子(渐变的)，然后设置到笔刷，画线(渐变的)
                QBrush brush(linearGradient);
                painter->setPen(QPen(brush, 1));
                painter->drawLine(point[i].pos.x(),point[i].pos.y(),point[j].pos.x(),point[j].pos.y());
            }
        }

        // 判断鼠标的距离(需要理解)，offset 是已经获取到的鼠标位置
        if (offset.x()) {
            if (pow(point[i].pos.x() - offset.x(), 2) + pow(point[i].pos.y() - offset.y(), 2) <= 80*80) {
                // 线性梯度，设置颜色将是线性渐变，可自由搭配(复制粘贴的，只要确定好起点为点，结束点为鼠标坐标点就行了)
                QLinearGradient linearGradient(point[i].pos.x(), point[i].pos.y(), offset.x(), offset.y());
                linearGradient.setColorAt(0, QColor(102, 255, 255));
                linearGradient.setColorAt(1, QColor(153,0,153));

                //            painter.setPen(QPen(brush, 1));
                painter->drawLine(point[i].pos.x(),point[i].pos.y(), offset.x(), offset.y());
            }
        }
    }

//    painter.end();

//    QWidget::paintEvent(event);
}
